cmake_minimum_required(VERSION 3.15 FATAL_ERROR) # 建议使用较新版本

# 定义项目名称和支持的语言
project(Recipe_21_CTest LANGUAGES CXX)



# 设置 C++ 标准为 C++11
set(CMAKE_CXX_STANDARD 11)

# 禁用 GNU 扩展,强制使用标准 C++
set(CMAKE_CXX_EXTENSIONS OFF)

# 确保 C++ 标准被严格遵守
set(CMAKE_CXX_STANDARD_REQUIRED ON)



# 查找 Python 解释器
# 推荐使用 Python3 模块,因为它更现代且支持组件查找
# Python3_EXECUTABLE 变量将包含 Python 解释器的路径
find_package(Python3 COMPONENTS Interpreter REQUIRED)

# 查找 Bash 可执行文件
find_program(BASH_EXECUTABLE NAMES bash REQUIRED)


# 定义一个库来封装 sum_integers 功能
# 这使得 sum_integers 可以被多个可执行文件链接
add_library(sum_integers_lib STATIC sum_integers.cpp) # 使用 STATIC 库



# 定义主应用程序可执行文件
add_executable(sum_up main.cpp)

# 将 sum_integers_lib 库链接到 sum_up 可执行文件
target_link_libraries(sum_up PRIVATE sum_integers_lib)

# 确保 sum_integers.hpp 可以被找到
target_include_directories(sum_up PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})



# 定义 C++ 测试可执行文件
add_executable(cpp_test_runner test.cpp)

# 将 sum_integers_lib 库链接到 cpp_test_runner
target_link_libraries(cpp_test_runner PRIVATE sum_integers_lib)

# 确保 sum_integers.hpp 可以被找到
target_include_directories(cpp_test_runner PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})

# 启用 CTest 测试功能
# 这会允许 CTest 发现并运行在此 CMakeLists.txt 中定义的测试
enable_testing()



# 定义 Bash 脚本测试
# NAME: 测试的名称
# COMMAND: 执行测试的命令。这里我们使用找到的 BASH_EXECUTABLE 来运行 test.sh 脚本。
# $<TARGET_FILE:sum_up> 是一个生成器表达式,它会在构建时被替换为 sum_up 可执行文件的完整路径。
# 这样做的好处是无需硬编码路径,提高了可移植性。

add_test(
  NAME bash_test
  COMMAND ${BASH_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test.sh $<TARGET_FILE:sum_up>
)



# 定义 C++ 可执行文件测试
# COMMAND: 直接运行我们之前定义的 cpp_test_runner 可执行文件。

add_test(
  NAME cpp_test
  COMMAND $<TARGET_FILE:cpp_test_runner>
)



# 定义 Python 脚本长模式测试
# COMMAND: 使用找到的 Python3_EXECUTABLE 运行 test.py 脚本。
# --executable 参数将 sum_up 可执行文件的路径传递给 Python 脚本。

add_test(
  NAME python_test_long
  COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test.py --executable $<TARGET_FILE:sum_up>
)



# 定义 Python 脚本短模式测试
# COMMAND: 同样运行 test.py,但额外传递 --short 参数。

add_test(
  NAME python_test_short
  COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test.py --short --executable $<TARGET_FILE:sum_up>

)
